/*!
 * \file HftStraContext.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief HFT策略上下文头文件
 * 
 * 本文件定义了HFT(High Frequency Trading)策略上下文类，作为HFT策略与引擎之间的桥梁。
 * 继承自HftStraBaseCtx基础上下文类，提供高频交易策略的生命周期管理和事件回调功能。
 * 负责将引擎的各种高频交易事件（如Tick数据、委托队列、委托明细、成交明细等）转发给具体的HFT策略实例。
 */
#pragma once
#include "HftStraBaseCtx.h"


USING_NS_WTP;

class HftStrategy;

/**
 * @class HftStraContext
 * @brief HFT策略上下文类
 * 
 * HFT策略上下文类，继承自HftStraBaseCtx，作为HFT策略与HFT引擎之间的桥梁。
 * 专门为高频交易场景设计，支持Level2数据处理和微秒级响应。
 * 
 * 主要功能包括：
 * - 管理HFT策略实例的生命周期
 * - 处理高频交易引擎事件并转发给策略
 * - 支持Tick数据、委托队列、委托明细、成交明细等Level2数据处理
 * - 提供交易通道状态管理和订单状态跟踪
 * - 支持持仓变化监控和动态盈亏计算
 * - 处理委托回报和成交回报事件
 * 
 * @note 每个HFT策略实例都对应一个HftStraContext上下文
 * @see HftStraBaseCtx, HftStrategy, WtHftEngine
 */
class HftStraContext : public HftStraBaseCtx
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 创建HFT策略上下文实例
	 * 
	 * @param engine HFT引擎指针
	 * @param name 策略名称
	 * @param bAgent 是否为代理模式
	 */
	HftStraContext(WtHftEngine* engine, const char* name, bool bAgent);
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理资源
	 */
	virtual ~HftStraContext();

	/**
	 * @brief 设置策略实例
	 * 
	 * 将HFT策略实例绑定到当前上下文
	 * 
	 * @param stra HFT策略实例指针
	 */
	void set_strategy(HftStrategy* stra){ _strategy = stra; }
	
	/**
	 * @brief 获取策略实例
	 * 
	 * 获取当前上下文绑定的HFT策略实例
	 * 
	 * @return HFT策略实例指针
	 */
	HftStrategy* get_stragety() { return _strategy; }

public:
	/**
	 * @brief 策略初始化回调
	 * 
	 * 当策略需要初始化时被调用，转发给具体的策略实例
	 */
	virtual void on_init() override;

	/**
	 * @brief 交易时段开始回调
	 * 
	 * 当交易时段开始时被调用，转发给具体的策略实例
	 * 
	 * @param uTDate 交易日期（格式：YYYYMMDD）
	 */
	virtual void on_session_begin(uint32_t uTDate) override;

	/**
	 * @brief 交易时段结束回调
	 * 
	 * 当交易时段结束时被调用，转发给具体的策略实例
	 * 
	 * @param uTDate 交易日期（格式：YYYYMMDD）
	 */
	virtual void on_session_end(uint32_t uTDate) override;

	/**
	 * @brief Tick数据回调
	 * 
	 * 当有新的Tick数据时被调用，转发给具体的策略实例
	 * 
	 * @param code 合约代码
	 * @param newTick 新的Tick数据
	 */
	virtual void on_tick(const char* code, WTSTickData* newTick) override;

	/**
	 * @brief 委托队列数据回调
	 * 
	 * 当有新的委托队列数据时被调用，转发给具体的策略实例
	 * 
	 * @param stdCode 标准合约代码
	 * @param newOrdQue 新的委托队列数据
	 */
	virtual void on_order_queue(const char* stdCode, WTSOrdQueData* newOrdQue) override;

	/**
	 * @brief 委托明细数据回调
	 * 
	 * 当有新的委托明细数据时被调用，转发给具体的策略实例
	 * 
	 * @param stdCode 标准合约代码
	 * @param newOrdDtl 新的委托明细数据
	 */
	virtual void on_order_detail(const char* stdCode, WTSOrdDtlData* newOrdDtl) override;

	/**
	 * @brief 成交明细数据回调
	 * 
	 * 当有新的成交明细数据时被调用，转发给具体的策略实例
	 * 
	 * @param stdCode 标准合约代码
	 * @param newTrans 新的成交明细数据
	 */
	virtual void on_transaction(const char* stdCode, WTSTransData* newTrans) override;

	/**
	 * @brief K线数据回调
	 * 
	 * 当有新的K线数据时被调用，转发给具体的策略实例
	 * 
	 * @param code 合约代码
	 * @param period K线周期
	 * @param times K线倍数
	 * @param newBar 新的K线数据
	 */
	virtual void on_bar(const char* code, const char* period, uint32_t times, WTSBarStruct* newBar) override;

	/**
	 * @brief 成交回报回调
	 * 
	 * 当有成交回报时被调用，转发给具体的策略实例
	 * 
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param isBuy 是否为买入
	 * @param vol 成交数量
	 * @param price 成交价格
	 */
	virtual void on_trade(uint32_t localid, const char* stdCode, bool isBuy, double vol, double price) override;

	/**
	 * @brief 订单回报回调
	 * 
	 * 当有订单状态变化时被调用，转发给具体的策略实例
	 * 
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param isBuy 是否为买入
	 * @param totalQty 总数量
	 * @param leftQty 剩余数量
	 * @param price 委托价格
	 * @param isCanceled 是否已撤销
	 */
	virtual void on_order(uint32_t localid, const char* stdCode, bool isBuy, double totalQty, double leftQty, double price, bool isCanceled = false) override;

	/**
	 * @brief 交易通道就绪回调
	 * 
	 * 当交易通道连接就绪时被调用，转发给具体的策略实例
	 */
	virtual void on_channel_ready() override;

	/**
	 * @brief 交易通道断开回调
	 * 
	 * 当交易通道连接断开时被调用，转发给具体的策略实例
	 */
	virtual void on_channel_lost() override;

	/**
	 * @brief 委托回报回调
	 * 
	 * 当有委托回报时被调用，转发给具体的策略实例
	 * 
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param bSuccess 委托是否成功
	 * @param message 回报消息
	 */
	virtual void on_entrust(uint32_t localid, const char* stdCode, bool bSuccess, const char* message) override;

	/**
	 * @brief 持仓变化回调
	 * 
	 * 当持仓发生变化时被调用，转发给具体的策略实例
	 * 
	 * @param stdCode 标准合约代码
	 * @param isLong 是否为多头持仓
	 * @param prevol 变化前总持仓
	 * @param preavail 变化前可用持仓
	 * @param newvol 变化后总持仓
	 * @param newavail 变化后可用持仓
	 * @param tradingday 交易日
	 */
	virtual void on_position(const char* stdCode, bool isLong, double prevol, double preavail, double newvol, double newavail, uint32_t tradingday) override;


private:
	HftStrategy*		_strategy;	/**< HFT策略实例指针 */
};

